home *** CD-ROM | disk | FTP | other *** search
- {$X+}
- unit ProgMan;
- { (c) 1996 by Bob Swart - http://home.pi.net/~drbob/ }
- interface
- uses
- WinProcs, WinTypes, Classes, SysUtils, Messages, Controls, StdCtrls, ExtCtrls, Graphics;
-
- {$IFNDEF WIN32}
- Type
- ShortString = String;
- {$ENDIF}
-
- Type
- TProgMan = class(TWinControl)
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
-
- procedure BeginConversation;
- procedure EndConversation;
-
- procedure GetGroups;
-
- procedure CreateNewGroup(Name: ShortString);
- procedure DeleteGroup(Name: ShortString);
- procedure Activate(Group: ShortString);
- procedure Iconize(Group: ShortString);
- procedure Maximize(Group: ShortString);
- procedure Minimize(Group: ShortString);
-
- procedure AddItemToActiveGroup(CommandLine: ShortString;
- Name: ShortString);
- procedure DeleteItemFromActiveGroup(Item: ShortString);
-
- private
- _About: ShortString;
- PMWindow: HWnd;
- Connected: Boolean;
- ClosedByPM: Boolean;
-
- procedure InitiateConversation;
- procedure TerminateConversation;
-
- procedure WMDDEData(var Msg: TWMDDE_Data);
- message wm_DDE_Data;
- procedure WMDDEAck(var Msg: TWMDDE_Ack);
- message wm_DDE_Ack;
- procedure WMDDETerminate(var Msg: TWMDDE_Terminate);
- message wm_DDE_Terminate;
-
- procedure SendMacroString(macro: PChar; size: Byte);
-
- protected
- FAbout: ShortString;
- FBitmap: TImage;
- FActive: Boolean;
- FGroups: TStringList;
- FOnDDEdata: TNotifyEvent;
-
- procedure SetActive(Value: Boolean); virtual;
- procedure SetGroups(Value: TStringList); virtual;
-
- published
- property About: ShortString read FAbout write _About;
- property Active: Boolean read FActive write SetActive;
- property Groups: TStringList read FGroups write SetGroups;
-
- property OnDDEdata: TNotifyEvent read FOnDDEdata write FOnDDEdata;
- end {TProgMan};
-
- procedure Register;
-
- implementation
- {$IFDEF WIN32}
- {$R PROGMAN.D32}
- {$ELSE}
- {$R PROGMAN.D16}
- {$ENDIF}
- uses
- Forms, Dialogs;
-
- {$IFDEF WIN32}
- Type
- PDDEData = ^TDDEData;
- TDDEData = packed record
- Flags: Word;
- cfFormat: SmallInt;
- Value: array[0..0] of Char {instead of Byte};
- end;
- {$ENDIF}
-
- constructor TProgMan.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- Height := 24;
- Width := 24;
- PMWindow := 0;
- FActive := False;
- Connected := False;
- ClosedByPM := False;
- FGroups := TStringList.Create;
- FBitmap := TImage.Create(Self);
- FBitmap.Parent := Self;
- FBitmap.Name := 'bitmap';
- FBitmap.Align := alNone;
- FBitmap.Autosize := True;
- {$IFDEF WIN32}
- FBitmap.Picture.Bitmap.
- LoadFromResourceName(HInstance,'TPROGMAN');
- {$ELSE}
- FBitmap.Picture.Bitmap.Handle := LoadBitmap(HInstance,'TPROGMAN');
- {$ENDIF}
- FAbout := 'TProgMan (c) 1996 by Bob Swart (aka Dr.Bob - http://home.pi.net/~drbob/)'
- end {Create};
-
- destructor TProgMan.Destroy;
- begin
- FGroups.Free;
- FBitmap.Free;
- inherited Destroy
- end {Destroy};
-
- procedure TProgMan.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
- begin
- inherited SetBounds(ALeft, ATop, 24, 24)
- end {SetBounds};
-
- procedure TProgMan.SetActive(Value: Boolean);
- begin
- if Value then BeginConversation
- else EndConversation;
- FActive := Value
- end {SetActive};
-
- procedure TProgMan.GetGroups;
- var Item: TAtom;
- begin
- if Connected then
- begin
- Item := GlobalAddAtom('Groups');
- if not PostMessage(PMWindow, wm_DDE_Request, Handle,
- {$IFDEF WIN32}
- PackDDElParam(wm_DDE_Request, CF_TEXT, Item))
- {$ELSE}
- MakeLong(CF_TEXT, Item))
- {$ENDIF}
- then
- GlobalDeleteAtom(Item)
- end
- end {GetGroups};
-
- procedure TProgMan.SetGroups(Value: TStringList);
- begin
- ShowMessage('Error: SetGroups not supported...')
- end {SetGroups};
-
- procedure TProgMan.WMDDEData(var Msg: TWMDDE_Data);
- { respond to a DDE data delivery message }
- {$IFDEF WIN32}
- var DataHandle,DataTopic: PUINT;
- {$ENDIF}
- var Data: PDDEData;
- begin
- inherited;
- {$IFDEF WIN32}
- if UnpackDDElParam(Msg.Msg, Msg.PackedVal, DataHandle, DataTopic) and
- (DataHandle <> nil) then
- Data := PDDEData(GlobalLock(DataHandle^))
- else Data := nil; { in Win32 design mode... }
- {$ELSE}
- Data := PDDEData(GlobalLock(Msg.Data));
- {$ENDIF}
- FGroups.Clear;
- if Data <> nil then
- FGroups.SetText(Data^.Value);
- {$IFDEF WIN32}
- if not PostMessage(PMWindow, wm_DDE_Ack, Handle, Msg.PackedVal) then
- FreeDDElParam(Msg.Msg, Msg.PackedVal);
- {$ENDIF}
- if Assigned(FOnDDEdata) then FOnDDEdata(Self)
- end {WMDDEData};
-
-
- procedure TProgMan.CreateNewGroup(Name: ShortString);
- var Len: Byte absolute Name;
- begin
- Name := '[CreateGroup(' + Name + ')]'#0;
- SendMacroString(@Name[1],Len)
- end {CreateNewGroup};
-
- procedure TProgMan.DeleteGroup(Name: ShortString);
- var Len: Byte absolute Name;
- begin
- Name := '[DeleteGroup(' + Name + ')]'#0;
- SendMacroString(@Name[1],Len)
- end {DeleteGroup};
-
- procedure TProgMan.Activate(Group: ShortString);
- var Len: Byte absolute Group;
- begin
- Group := '[ShowGroup(' + Group + ',1)]'#0;
- SendMacroString(@Group[1],Len)
- end {Activate};
-
- procedure TProgMan.Iconize(Group: ShortString);
- var Len: Byte absolute Group;
- begin
- Group := '[ShowGroup(' + Group +',2)]'#0;
- SendMacroString(@Group[1],Len)
- end {Iconize};
-
- procedure TProgMan.Maximize(Group: ShortString);
- var Len: Byte absolute Group;
- begin
- Group := '[ShowGroup(' + Group +',3)]'#0;
- SendMacroString(@Group[1],Len)
- end {Maximize};
-
- procedure TProgMan.Minimize(Group: ShortString);
- var Len: Byte absolute Group;
- begin
- Group := '[ShowGroup(' + Group +',6)]'#0;
- SendMacroString(@Group[1],Len)
- end {Minimize};
-
- procedure TProgMan.AddItemToActiveGroup(CommandLine: ShortString;
- Name: ShortString);
- var Len: Byte absolute CommandLine;
- begin
- if Name <> '' then
- CommandLine := '[AddItem(' + CommandLine + ',' + Name +')]'#0
- else { command-line }
- CommandLine := '[AddItem(' + CommandLine +')]'#0;
- SendMacroString(@CommandLine[1],Len)
- end {AddItemToActiveGroup};
-
- procedure TProgMan.DeleteItemFromActiveGroup(Item: ShortString);
- var Len: Byte absolute Item;
- begin
- Item := '[DeleteItem(' + Item +')]'#0;
- SendMacroString(@Item[1],Len)
- end {DeleteItemFromActiveGroup};
-
-
- procedure TProgMan.BeginConversation;
- begin
- if not Connected then InitiateConversation
- end {BeginConversation};
-
- procedure TProgMan.EndConversation;
- begin
- if Connected then TerminateConversation
- end {EndConversation};
-
-
- procedure TProgMan.InitiateConversation;
- var ApplicationName, Topic: TAtom;
- begin
- ApplicationName := GlobalAddAtom('PROGMAN');
- Topic := GlobalAddAtom('PROGMAN');
- if SendMessage(HWnd(-1), wm_DDE_Initiate, Handle,
- {$IFDEF WIN32}
- PackDDElParam(wm_DDE_Initiate, ApplicationName, Topic)) = 0
- {$ELSE}
- MakeLong(ApplicationName, Topic)) = 0
- {$ENDIF}
- then
- begin
- GlobalDeleteAtom(ApplicationName);
- GlobalDeleteAtom(Topic)
- end
- end {InitiateConversation};
-
- procedure TProgMan.TerminateConversation;
- begin
- PostMessage(PMWindow, wm_DDE_Terminate, Handle, LongInt(0));
- PMWindow := 0
- end {Terminate};
-
- procedure TProgMan.WMDDEAck(var Msg: TWMDDE_Ack);
- { respond to a DDE acknowledgement message }
- {$IFDEF WIN32}
- var DataHandle,DataTopic: PUINT;
- Const MaxSize = 9;
- var Name: Array[0..MaxSize] of Char;
- {$ENDIF}
- begin
- inherited;
- if not Connected then { sent message }
- begin
- Connected := True;
- PMWindow := Msg.PostingApp;
- {$IFDEF WIN32}
- FillChar(Name,MaxSize+1,#0);
- if UnpackDDElParam(Msg.Msg, Msg.PackedVal, DataHandle, DataTopic) then
- begin
- GlobalGetAtomName(DataTopic^,@Name[0],MaxSize);
- Name[MaxSize] := #0;
- { MessageBox(GetFocus,Name,Name,MB_OK); }
- end;
- {$ENDIF}
- if Connected then GetGroups
- end
- {$IFDEF WIN32s}
- else { posted message }
- begin
- if UnpackDDElParam(Msg.Msg, Msg.PackedVal, DataHandle, DataTopic) and
- (DataHandle <> nil) then
- FreeDDElParam(Msg.Msg, Msg.PackedVal)
- end
- {$ENDIF}
- end {WMDDEAck};
-
- procedure TProgMan.WMDDETerminate(var Msg: TWMDDE_Terminate);
- { respond to a DDE terminate message }
- begin
- inherited;
- if (PMWindow <> 0) and not ClosedByPM then { we're not closing }
- begin
- ClosedByPM := True;
- PostMessage(PMWindow, wm_DDE_Terminate, Handle, LongInt(0))
- end;
- Connected := False
- end {WMDDETerminate};
-
- procedure TProgMan.SendMacroString(macro: PChar; size: Byte);
- var MacroHandle: Cardinal;
- MacroPChar: PChar;
- begin
- MacroHandle := GlobalAlloc(gmem_moveable OR gmem_DDEShare, size+1);
- if MacroHandle <> 0 then
- begin
- MacroPChar := PChar(GlobalLock(MacroHandle));
- if MacroPChar <> nil then
- begin
- StrCopy(MacroPChar, macro);
- GlobalUnLock(MacroHandle);
- if not PostMessage(PMWindow, wm_DDE_Execute, Handle,
- {$IFDEF WIN32}
- PackDDElParam(wm_DDE_Execute, 0, MacroHandle))
- {$ELSE}
- MakeLong(0, MacroHandle))
- {$ENDIF}
- then
- GlobalFree(MacroHandle)
- end
- else
- GlobalFree(MacroHandle)
- end
- end {SendMacroString};
-
- procedure Register;
- begin
- RegisterComponents('Dr.Bob', [TProgMan])
- end;
- end.
-